package com.taylor.nio;

import org.testng.annotations.Test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @Desc : MappedByteBuffer，可以让文件直接在内存（堆外的内存）中进行修改
 * @Author ： taylor
 * @Date ：2021/6/26 18:36
 */
public class MappedByteBufferTest {

    @Test
    public void test(){
        try (RandomAccessFile randomAccessFile = new RandomAccessFile("1.txt", "rw")) {
            //获取对应的通道
            FileChannel channel = randomAccessFile.getChannel();

            /**
             * 参数 1:FileChannel.MapMode.READ_WRITE 使用的读写模式
             * 参数 2：0：可以直接修改的起始位置
             * 参数 3:5: 是映射到内存的大小（不是索引位置），即将 1.txt 的多少个字节映射到内存
             * 可以直接修改的范围就是 0-5
             * 实际类型 DirectByteBuffer
             */
            MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 5);

            mappedByteBuffer.put(0, (byte) 'H');
            mappedByteBuffer.put(3, (byte) '9');
            //IndexOutOfBoundsException
            mappedByteBuffer.put(5, (byte) 'Y');

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
